/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package interpretadorportugolvisual.partes;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;

/**
 *
 * @author abraaoisvioliveirasouzadocarmo
 */
public class Processador {

    public enum Estado {
        ativando,
        desativando,
        ula_ativando,
        ula_desativando,
        parado
    };

    Estado estado = Estado.parado;
    long tempoInicial = System.currentTimeMillis();

    Color corFonte = Color.white;
    float greenLevel = 0;
    float blueLevel = 1;

    public Processador() {
    }

    public void ativar() {
        setEstado(Estado.ativando);
    }

    public void ativarUla() {
        setEstado(Estado.ula_ativando);
    }

    public void desenhar(Graphics g, int x, int y) {

        g.setColor(new Color(0, greenLevel, 0));
        g.fillRect(x, y, 200, 100);
        g.setColor(corFonte);
        Font font = Font.decode("Monospaced 24");
        g.setFont(font);
        g.drawString("CPU", x+80, y+50);

        desenharUla(g, x, y);
        atualizar();
    }

    private void desenharUla(Graphics g, int x, int y) {
        g.setColor(new Color(1, 1, blueLevel));
        g.fillRect(x+140, y+40, 50, 50);
        g.setColor(Color.BLACK);
        Font font = Font.decode("Monospaced 18");
        g.setFont(font);
        g.drawString("ULA", x+150, y+70);
    }

    public Estado getEstado() {
        return estado;
    }

    public void setEstado(Estado estado) {
        tempoInicial = System.currentTimeMillis();
        this.estado = estado;
    }


    public void atualizar() {
        long atual = System.currentTimeMillis();

        if((atual - tempoInicial) >= 200) {
                switch(getEstado()) {
                    case ativando:
                        atualizarAtivando();
                        break;                 
                    case desativando:
                        atualizarDesativando();
                        break;

                    case ula_ativando:
                        atualizarUlaAtivando();
                        break;
                    case ula_desativando:
                        atualizarUlaDesativando();
                        break;  
                }
        }
    }

    private void atualizarAtivando() {
        long atual = System.currentTimeMillis();

        if((atual - tempoInicial) >= 50) {
            tempoInicial = atual;
            greenLevel = greenLevel + 0.5f;
        }

        if(greenLevel >= 1) {
            greenLevel = 1;
            setEstado(Estado.desativando);
        }
    }

    private void atualizarDesativando() {
        long atual = System.currentTimeMillis();

        if((atual - tempoInicial) >= 50) {
            tempoInicial = atual;
            greenLevel = greenLevel - 0.5f;
        }

        if(greenLevel <= 0) {
            greenLevel = 0;
            setEstado(Estado.parado);
        }
    }

    private void atualizarUlaAtivando() {
        long atual = System.currentTimeMillis();

        if((atual - tempoInicial) >= 50) {
            tempoInicial = atual;
            blueLevel = blueLevel - 0.5f;
        }

        if(blueLevel <= 0) {
            blueLevel = 0;
            setEstado(Estado.ula_desativando);
        }

    }

    private void atualizarUlaDesativando() {
        long atual = System.currentTimeMillis();

        if((atual - tempoInicial) >= 50) {
            tempoInicial = atual;
            blueLevel = blueLevel + 0.5f;
        }

        if(blueLevel >= 1) {
            blueLevel = 1;
            setEstado(Estado.parado);
        }
    }
}
